package org.ggp.base.player.gamer.statemachine.random; import java.util.List; import java.util.concurrent.ThreadLocalRandom; import org.ggp.base.apps.player.detail.DetailPanel; import org.ggp.base.apps.player.detail.SimpleDetailPanel; import org.ggp.base.player.gamer.event.GamerSelectedMoveEvent; import org.ggp.base.player.gamer.exception.GamePreviewException; import org.ggp.base.player.gamer.statemachine.StateMachineGamer; import org.ggp.base.util.game.Game; import org.ggp.base.util.statemachine.Move; import org.ggp.base.util.statemachine.StateMachine; import org.ggp.base.util.statemachine.cache.CachedStateMachine; import org.ggp.base.util.statemachine.exceptions.GoalDefinitionException; import org.ggp.base.util.statemachine.exceptions.MoveDefinitionException; import org.ggp.base.util.statemachine.exceptions.TransitionDefinitionException; import org.ggp.base.util.statemachine.implementation.prover.ProverStateMachine; /** * RandomGamer is a very simple state-machine-based Gamer that will always * pick randomly from the legal moves it finds at any state in the game. */ public final class RandomGamer extends StateMachineGamer { @Override public String getName() { return "Random"; } @Override public Move stateMachineSelectMove(long timeout) throws TransitionDefinitionException, MoveDefinitionException, GoalDefinitionException { long start = System.currentTimeMillis(); List<Move> moves = getStateMachine().getLegalMoves(getCurrentState(), getRole()); Move selection = (moves.get(ThreadLocalRandom.current().nextInt(moves.size()))); long stop = System.currentTimeMillis(); notifyObservers(new GamerSelectedMoveEvent(moves, selection, stop - start)); return selection; } @Override public StateMachine getInitialStateMachine() { return new CachedStateMachine(new ProverStateMachine()); } @Override public void preview(Game g, long timeout) throws GamePreviewException { // Random gamer does no game previewing. } @Override public void stateMachineMetaGame(long timeout) throws TransitionDefinitionException, MoveDefinitionException, GoalDefinitionException { // Random gamer does no metagaming at the beginning of the match. } @Override public void stateMachineStop() { // Random gamer does no special cleanup when the match ends normally. } @Override public void stateMachineAbort() { // Random gamer does no special cleanup when the match ends abruptly. } @Override public DetailPanel getDetailPanel() { return new SimpleDetailPanel(); } }